8. Exceptional Control Flow
ํ๋ก์ธ์์ ์ปจํธ๋กค ํ๋ก (Control Flow)๋ PC์ ๊ฐ์ด ๋์์์ด ์ฆ๊ฐํ๋ฉฐ ํด๋น ์ฃผ์์ ๋ช ๋ น์ด๋ฅผ ์ฝ๋ ๊ณผ์ ์ ์๋ฏธ. ๋ชจ๋ ํ๋ก๊ทธ๋จ์ PC๊ฐ ๊ณ์ 1์ฉ ์ฆ๊ฐํ๋ ๊ฒ์ ์๋์์. ๋ํ์ ์ผ๋ก ๋ถ๊ธฐ, ๋ฐ๋ณต๊ณผ ๊ฐ์ jump๊ฐ ์๊ฒ ๋ค. ์ด ๊ฒฝ์ฐ PC๋ ์๋ก ์ธ์ ํ์ง ์์ ๋ ์ฃผ์ ์ฌ์ด๋ฅผ ๋๋๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ๋ถ๊ธฐ๋ ๋ฐ๋ณต์ ๊ฒฝ์ฐ, ํ๋ก๊ทธ๋จ ๋ด๋ถ์ ์ํ์ ๋ฐ๋ผ์๋ง PC๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ด๋ผ๋ ์ . ECF(Exceptional Control Flow)๋ ์์คํ ์ ์ํ๋ณํ์ ๋ฐ๋ผ์ PC๋ฅผ ์ฎ๊ธฐ๋ ์์ ์ ์ผ์ปซ๋๋ค. ๋ํ์ ์ผ๋ก
- ํจํท์ด ๋ค์ด์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋์คํฌ์ ์๋ ํ์ผ์ ๋ถ๋ฌ์ค๋ ์ค์ด๋ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค ์ฌ๋ฆด๋๊น์ง ๋๊ธฐํ ์ ์๋ ๊ฒฝ์ฐ
- ํ๋์จ์ด ํ์ด๋จธ๊ฐ ์ผ์ ์ธํฐ๋ฒ์ ๋๊ฒจ๋ฒ๋ฆฐ ๊ฒฝ์ฐ
- ์์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ธฐ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ
ECF๋ ์ฌ๋ฌ์ข ๋ฅ๊ฐ ์๋ค. ํ๋์จ์ด ๋จ์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ธ์ฒ๋ฆฌ๊ธฐ (exception handlers), OS ๋จ์์ ํ ํ๋ก์ธ์ค์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก ๋ฌธ๋งฅ์ ํ(Context Switching), ์ ์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ๋ณด๋ด๋ ์๊ทธ๋์ด ์๋ค. ์ด๋ฐ ๊ฐ๋ณ์ ์ธ ํ๋ก๊ทธ๋จ๋ค์ ์ผ๋ฐ์ ์ธ ์คํํ๋ฆ์ผ๋ก๋ถํฐ ๋ฒ์ด๋ side stepping์ ํ ์๋ ์๊ณ , ๋๋ nonlocal jump ์ํํ ์๋ ์๋ค.
ECF๋ฅผ ๋ฐฐ์์ผ ํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ค์ํ ์์คํ ์ปจ์ (IO, ํ๋ก์ธ์ค, ๊ฐ์๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ดํดํ๋๋ฐ ์ฌ์ค์ ํ์๋ก ์์์ผ ํ๊ธฐ ๋๋ฌธ.
- ์ปค๋ ์ฝ๋์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐ ECF๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ. (
trap
andsyscall
) - ํฅ๋ฏธ๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๋ฐ ํ์ํ๊ธฐ ๋๋ฌธ. ์ ธ์ ๋ง๋ค์ด ์ ธ ์์์ ์ฌ๋ฌ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๋ค์ ์คํ์ํค๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ด์ผ ํ๋ ๊ฒฝ์ฐ, ๋๋ง์ ์น ์๋ฒ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ
- concurrency ๊ฐ๋ ์ ์ตํ๋ ๋ฐ์ ์์ฃผ ์ค์ํ๊ธฐ ๋๋ฌธ.
- C++๋ JAVA์์ ์ ๊ณตํ๋ Software Exceptions๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ ์ฃผ๊ธฐ ๋๋ฌธ. SW exception์ OS exception๊ณผ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง, ์ ์ ์ฝ๋ ์์์ nonlocal jump๋ฅผ ํ๊ธฐ ์ํด ์ด๋ค ๋ฉ์ปค๋์ฆ์ด ๋ค์ด๊ฐ๋์ง ์๊ฒ๋๋ค.
์์ธ๋ ํ๋์จ์ด์ OS, ํ๋ก์ธ์ค ๊ฐ์ ๊ต์ฐจ์ ์ ์๊ฒ ํด์ค๋ค. ์์คํ ์ฝ๋ก ํ์ฌ๊ธ OS์ ์ ์ ํ๋ก์ธ์ค๊ฐ ์ด๋ป๊ฒ ์ํธ์์ฉ ํ๋์ง์ ๋ํด ์์๋ณด๊ณ , ํ๋ก์ธ์ค์ ํ๋ก์ธ์ค ๊ฐ์ ์ด๋ป๊ฒ ์ํธ์์ฉ ํ๋์ง์ ๋ํด ์์๋ณธ๋ค.
DUMP
- โญ๏ธ 8.1 Exceptions
- 8.2. Processes
- Process๋ ํผ์์ ์์คํ ์ ์ฒด๋ฅผ ์ ์ ํ๊ณ ์๋ค๋ ์ฐฉ๊ฐ์ ํ๊ฒ ๋ง๋ ๋ค. ๊ทธ ์๋์๋ ๋ ผ๋ฆฌํ๋ฆ์ ๋ฐ๋ผ ๋ฉํฐํ์คํน(ํน์ time slicing)์ ์ฌ์ฉํ๋ค.
- ์ ์ ๋ชจ๋์ ์ปค๋๋ชจ๋: ์ปค๋๋ชจ๋๋นํธ๊ฐ ์ผ์ ธ์์ผ๋ฉด ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ ๋ฑ ๊ถํ์ด ๊ฐํ๋๋ค. ํ์ง๋ง ์ ์ ํ๋ก์ธ์ค๋ ์ปค๋๋ชจ๋๋ก ๊ฐ์ ๋ก ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ง syscall ์ธํฐํ์ด์ค๋ง์ ํตํด ์์คํ ์์์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
- Context Switches: ํ๋ก์ธ์ค ์ํ(code, data, stack, registers, pc, env, fd)๋ฅผ Context๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ปจํ
์คํธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ผ๋ง๋ ์ง ์ค๋จ์์ผฐ๋ ํ๋ก์ธ์ค๋ฅผ ๋ค์ preempt(์ ์ )ํ ์ ์๋ค. ์ค์ผ์ค๋ฌ๋ ์ด๋ ๊ฒ ์ ์ ํ ํ๋ก์ธ์ค๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๊ณ , ๋ค์ ๋จ๊ณ์ ์ํด์ ์ปจํ
์คํธ๋ฅผ ๋ณํํ๊ฒ ๋๋ค.
- ๊ธฐ์กด ํ๋ก์ธ์ค์ ์ปจํ ์คํธ๋ฅผ ์ ์ฅํ๋ค.
- ์ ์ ํ ํ๋ก์ธ์ค์ ์ปจํ ์คํธ๋ฅผ ๋ถ๋ฌ์จ๋ค.
- ์คํํ๋ฆ์ ๋ค์ ์ฎ๊ธด๋ค.
- context switch์ ๊ฒฐ๊ณผ๋ก ์ง์ ์ ์คํ์ค์ด๋ ์คํํ๋ฆ์ด
- ์ฌ๊ฐ๋ ์๋ ์๊ณ
- ready list์ ๋ค์ด๊ฐ ์๋ ์๊ณ
- ์ข ๋ฃ๋ ์๋ ์๋ค.
- trap์ ์ํด syscall์ด ํธ์ถ๋ ์๋ ์์ง๋ง interrupt์ ์ํด์๋ context switch๋ ์๋ ์๋ค.
- trap: ์ปค๋์๊ฒ
read
์์ฒญ์ ๋ณด๋ด๋ฉด ๋์คํฌ๊ฐ ์๋ฃ ์๊ทธ๋์ ๋ณด๋ผ๋๊น์ง ํ ํ๋ก์ธ์ค๋ฅผ sleep์ํค๊ณ context switch - interrupt: IO device(timer, disk controller)๊ฐ ๋ณด๋ด๋ ์ ํธ์ ๋ฐ๋ผ context switch
- ์์คํ ์ฝ์ ๋ด๋ถ ์ธํฐ๋ฝํธ, ์ํํธ์จ์ด ์ธํฐ๋ฝํธ์ ํด๋น.
- trap: ์ปค๋์๊ฒ
- 8.3. System Call Error Handling
strerror(errno)
์ ์ญ๋ณ์errno
๋ฅผ ํด์ํด์ฃผ๋ ํจ์strerror
๋ฅผ ์ ํ์ฉํ์.
- 8.4. Process Control
getpid
๋์ pid,getppid
๋ถ๋ชจ ํ๋ก์ธ์ค์ pid- ํ๋ก์ธ์ค์ ์ํ๋ ์ธ๊ฐ์ง์ด๋ค.
fork
๋ฅผ ํตํด ๋ถ๋ชจ์ ๊ฑฐ์ ๋์ผํ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์์ ํ๋ก์ธ์ค๊ฐ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉดexecve
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.- ์์ ํ๋ก์ธ์ค๊ฐ terminated ๋๋๋ผ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ๋ช ์์ ์ผ๋ก wait ํ์ง ์์ ์ฑ๋ก terminated ๋๋ฉด ์์ ํ๋ก์ธ์ค๋ ์ข๋น ํ๋ก์ธ์ค๊ฐ ๋๋ค.
sleep
์ ์ ๋ช ํ์ง. ๋ช์ด๋์ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๋ค.
- โญ๏ธ 8.5. Signals
- 8.6. Nonlocal Jumps
setjmp
,longjmp
๋ฅผ ํตํ ์์ธ์ ์ธ ์คํํ๋ฆ์ ์ ์ ํ๋ก์ธ์ค ๋จ์์ ๋ง๋ค์ด๋ผ ์ ์๋ค.setjmp
๋ ์ด ํจ์๋ฅผ ํธ์ถํ๋ ํ๋ก์ธ์ค์ ํ๊ฒฝ์env
๋ฒํผ์ ๋ด์ ์ ์ฅํ๋ ์ญํ ์ ํ๋ค.switch
๋ฌธ์ ํ์ฉํดlongjmp
ํธ์ถ ์ ๋ฃ์๋ ์ธ์retval
์ ๊ตฌ๋ถํ ์ ์๋ค.longjmp
๋env
๋ฒํผ๋ก๋ถํฐ ๋ค์setjmp
๋ฅผ ํธ์ถํ๋ ์์ ์ผ๋ก ๋์๊ฐ๋ค. ๋ํ์ ์ผ๋ก ๊น๊ฒ ํธ์ถ๋ ์ฌ๊ทํจ์ ์์์ ํน์ ํ ์ํฉ์์ ๋น ๋ฅด๊ฒ ๊ธฐ์กด ์์น๋ก ๋์์์ผ ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
- 8.7. Tools for Manipulating Processes
- 8.8. Summary
MISC
8.2.3. Private Address Space ์์ ์ฐธ์กฐํ Process address space ๋์ํ